﻿using SwfLib.Avm2.Opcodes;
using SwfLib.Avm2.Opcodes.Arithmetics;
using SwfLib.Avm2.Opcodes.Branching;
using SwfLib.Avm2.Opcodes.ByteArray;
using SwfLib.Avm2.Opcodes.Debug;
using SwfLib.Avm2.Opcodes.Stack;
using SwfLib.Avm2.Opcodes.TypeCasting;
using SwfLib.Avm2.Opcodes.Xml;

namespace SwfLib.Avm2 {
    public interface IAvm2OpcodeVisitor<TArg, TResult> {

        TResult Visit(AddOpcode opcode, TArg arg);
        TResult Visit(AddIOpcode opcode, TArg arg);
        TResult Visit(AsTypeOpcode opcode, TArg arg);
        TResult Visit(AsTypeLateOpcode opcode, TArg arg);
        TResult Visit(BitAndOpcode opcode, TArg arg);
        TResult Visit(BitNotOpcode opcode, TArg arg);
        TResult Visit(BitOrOpcode opcode, TArg arg);
        TResult Visit(BitXorOpcode opcode, TArg arg);
        TResult Visit(BreakpointOpcode opcode, TArg arg);
        TResult Visit(BreakpointLineOpcode opcode, TArg arg);
        TResult Visit(CallOpcode opcode, TArg arg);
        TResult Visit(CallMethodOpcode opcode, TArg arg);
        TResult Visit(CallPropertyOpcode opcode, TArg arg);
        TResult Visit(CallPropLexOpcode opcode, TArg arg);
        TResult Visit(CallPropVoidOpcode opcode, TArg arg);
        TResult Visit(CallStaticOpcode opcode, TArg arg);
        TResult Visit(CallSuperOpcode opcode, TArg arg);
        TResult Visit(CallSuperVoidOpcode opcode, TArg arg);
        TResult Visit(CheckFilterOpcode opcode, TArg arg);
        TResult Visit(CoerceOpcode opcode, TArg arg);
        TResult Visit(CoerceAOpcode opcode, TArg arg);
        TResult Visit(CoerceBOpcode opcode, TArg arg);
        TResult Visit(CoerceDOpcode opcode, TArg arg);
        TResult Visit(CoerceIOpcode opcode, TArg arg);
        TResult Visit(CoerceOOpcode opcode, TArg arg);
        TResult Visit(CoerceSOpcode opcode, TArg arg);
        TResult Visit(CoerceUOpcode opcode, TArg arg);
        TResult Visit(ConstructOpcode opcode, TArg arg);
        TResult Visit(ConstructPropOpcode opcode, TArg arg);
        TResult Visit(ConstructSuperOpcode opcode, TArg arg);
        TResult Visit(ConvertBOpcode opcode, TArg arg);
        TResult Visit(ConvertDOpcode opcode, TArg arg);
        TResult Visit(ConvertIOpcode opcode, TArg arg);
        TResult Visit(ConvertOOpcode opcode, TArg arg);
        TResult Visit(ConvertSOpcode opcode, TArg arg);
        TResult Visit(ConvertUOpcode opcode, TArg arg);
        TResult Visit(DebugOpcode opcode, TArg arg);
        TResult Visit(DebugFileOpcode opcode, TArg arg);
        TResult Visit(DebugLineOpcode opcode, TArg arg);
        TResult Visit(DecLocalOpcode opcode, TArg arg);
        TResult Visit(DecLocalIOpcode opcode, TArg arg);
        TResult Visit(DecrementOpcode opcode, TArg arg);
        TResult Visit(DecrementIOpcode opcode, TArg arg);
        TResult Visit(DeletePropertyOpcode opcode, TArg arg);
        TResult Visit(DivideOpcode opcode, TArg arg);
        TResult Visit(DupOpcode opcode, TArg arg);
        TResult Visit(DxnsOpcode opcode, TArg arg);
        TResult Visit(DxnsLateOpcode opcode, TArg arg);
        TResult Visit(EqualsOpcode opcode, TArg arg);
        TResult Visit(EscXAttrOpcode opcode, TArg arg);
        TResult Visit(EscXElemOpcode opcode, TArg arg);
        TResult Visit(FindDefinitionOpcode opcode, TArg arg);
        TResult Visit(FindPropertyOpcode opcode, TArg arg);
        TResult Visit(FindPropStrictOpcode opcode, TArg arg);
        TResult Visit(GetDescendantsOpcode opcode, TArg arg);
        TResult Visit(GetGlobalScopeOpcode opcode, TArg arg);
        TResult Visit(GetGlobalSlotOpcode opcode, TArg arg);
        TResult Visit(GetLexOpcode opcode, TArg arg);
        TResult Visit(GetLocalOpcode opcode, TArg arg);
        TResult Visit(GetLocal0Opcode opcode, TArg arg);
        TResult Visit(GetLocal1Opcode opcode, TArg arg);
        TResult Visit(GetLocal2Opcode opcode, TArg arg);
        TResult Visit(GetLocal3Opcode opcode, TArg arg);
        TResult Visit(GetPropertyOpcode opcode, TArg arg);
        TResult Visit(GetScopeObjectOpcode opcode, TArg arg);
        TResult Visit(GetSlotOpcode opcode, TArg arg);
        TResult Visit(GetSuperOpcode opcode, TArg arg);
        TResult Visit(GreaterEqualsOpcode opcode, TArg arg);
        TResult Visit(GreaterThanOpcode opcode, TArg arg);
        TResult Visit(HasNextOpcode opcode, TArg arg);
        TResult Visit(HasNext2Opcode opcode, TArg arg);
        TResult Visit(IfeqOpcode opcode, TArg arg);
        TResult Visit(IfFalseOpcode opcode, TArg arg);
        TResult Visit(IfgeOpcode opcode, TArg arg);
        TResult Visit(IfgtOpcode opcode, TArg arg);
        TResult Visit(IfleOpcode opcode, TArg arg);
        TResult Visit(IfltOpcode opcode, TArg arg);
        TResult Visit(IfneOpcode opcode, TArg arg);
        TResult Visit(IfngeOpcode opcode, TArg arg);
        TResult Visit(IfngtOpcode opcode, TArg arg);
        TResult Visit(IfnleOpcode opcode, TArg arg);
        TResult Visit(IfnltOpcode opcode, TArg arg);
        TResult Visit(IfStrictEqOpcode opcode, TArg arg);
        TResult Visit(IfStrictNeOpcode opcode, TArg arg);
        TResult Visit(IfTrueOpcode opcode, TArg arg);
        TResult Visit(InOpcode opcode, TArg arg);
        TResult Visit(IncLocalOpcode opcode, TArg arg);
        TResult Visit(IncLocalIOpcode opcode, TArg arg);
        TResult Visit(IncrementOpcode opcode, TArg arg);
        TResult Visit(IncrementIOpcode opcode, TArg arg);
        TResult Visit(InitPropertyOpcode opcode, TArg arg);
        TResult Visit(InstanceOfOpcode opcode, TArg arg);
        TResult Visit(IsTypeOpcode opcode, TArg arg);
        TResult Visit(IsTypeLateOpcode opcode, TArg arg);
        TResult Visit(JumpOpcode opcode, TArg arg);
        TResult Visit(KillOpcode opcode, TArg arg);
        TResult Visit(LabelOpcode opcode, TArg arg);
        TResult Visit(LessEqualsOpcode opcode, TArg arg);
        TResult Visit(LessThanOpcode opcode, TArg arg);
        TResult Visit(Lf32Opcode opcode, TArg arg);
        TResult Visit(Lf64Opcode opcode, TArg arg);
        TResult Visit(Li8Opcode opcode, TArg arg);
        TResult Visit(Li16Opcode opcode, TArg arg);
        TResult Visit(Li32Opcode opcode, TArg arg);
        TResult Visit(LookupSwitchOpcode opcode, TArg arg);
        TResult Visit(LShiftOpcode opcode, TArg arg);
        TResult Visit(ModuloOpcode opcode, TArg arg);
        TResult Visit(MultiplyOpcode opcode, TArg arg);
        TResult Visit(MultiplyIOpcode opcode, TArg arg);
        TResult Visit(NegateOpcode opcode, TArg arg);
        TResult Visit(NegateIOpcode opcode, TArg arg);
        TResult Visit(NewActivationOpcode opcode, TArg arg);
        TResult Visit(NewArrayOpcode opcode, TArg arg);
        TResult Visit(NewCatchOpcode opcode, TArg arg);
        TResult Visit(NewClassOpcode opcode, TArg arg);
        TResult Visit(NewFunctionOpcode opcode, TArg arg);
        TResult Visit(NewObjectOpcode opcode, TArg arg);
        TResult Visit(NextNameOpcode opcode, TArg arg);
        TResult Visit(NextValueOpcode opcode, TArg arg);
        TResult Visit(NopOpcode opcode, TArg arg);
        TResult Visit(NotOpcode opcode, TArg arg);
        TResult Visit(PopOpcode opcode, TArg arg);
        TResult Visit(PopScopeOpcode opcode, TArg arg);
        TResult Visit(PushByteOpcode opcode, TArg arg);
        TResult Visit(PushDoubleOpcode opcode, TArg arg);
        TResult Visit(PushFalseOpcode opcode, TArg arg);
        TResult Visit(PushIntOpcode opcode, TArg arg);
        TResult Visit(PushNamespaceOpcode opcode, TArg arg);
        TResult Visit(PushNanOpcode opcode, TArg arg);
        TResult Visit(PushNullOpcode opcode, TArg arg);
        TResult Visit(PushScopeOpcode opcode, TArg arg);
        TResult Visit(PushShortOpcode opcode, TArg arg);
        TResult Visit(PushStringOpcode opcode, TArg arg);
        TResult Visit(PushTrueOpcode opcode, TArg arg);
        TResult Visit(PushUIntOpcode opcode, TArg arg);
        TResult Visit(PushUndefinedOpcode opcode, TArg arg);
        TResult Visit(PushWithOpcode opcode, TArg arg);
        TResult Visit(ReturnValueOpcode opcode, TArg arg);
        TResult Visit(ReturnVoidOpcode opcode, TArg arg);
        TResult Visit(RShiftOpcode opcode, TArg arg);
        TResult Visit(SetGlobalSlotOpcode opcode, TArg arg);
        TResult Visit(SetLocalOpcode opcode, TArg arg);
        TResult Visit(SetLocal0Opcode opcode, TArg arg);
        TResult Visit(SetLocal1Opcode opcode, TArg arg);
        TResult Visit(SetLocal2Opcode opcode, TArg arg);
        TResult Visit(SetLocal3Opcode opcode, TArg arg);
        TResult Visit(SetPropertyOpcode opcode, TArg arg);
        TResult Visit(SetSlotOpcode opcode, TArg arg);
        TResult Visit(SetSuperOpcode opcode, TArg arg);
        TResult Visit(Sf32Opcode opcode, TArg arg);
        TResult Visit(Sf64Opcode opcode, TArg arg);
        TResult Visit(Si8Opcode opcode, TArg arg);
        TResult Visit(Si16Opcode opcode, TArg arg);
        TResult Visit(Si32Opcode opcode, TArg arg);
        TResult Visit(StrictEqualsOpcode opcode, TArg arg);
        TResult Visit(SubtractOpcode opcode, TArg arg);
        TResult Visit(SubtractIOpcode opcode, TArg arg);
        TResult Visit(SwapOpcode opcode, TArg arg);
        TResult Visit(ThrowOpcode opcode, TArg arg);
        TResult Visit(TimestampOpcode opcode, TArg arg);
        TResult Visit(TypeOfOpcode opcode, TArg arg);
        TResult Visit(UrshiftOpcode opcode, TArg arg);
        
        TResult Visit(UnknownOpcode opcode, TArg arg);
     
        //TResult Visit(BaseAvm2Opcode opcode, TArg arg);

    }
}
